#include <iostream>
using namespace std;

// g++ moveConstruct01.cpp -fno-elide-constructors  使用此命令编译本代码，可以避免编译器优化

class demo
{
public:
    demo() : num(new int(0))
    {
        cout << "construct!" << endl;
    }
    // 拷贝构造函数
    demo(const demo &d) : num(new int(*d.num))
    {
        cout << "copy construct!" << endl;
    }

    demo& operator=(const demo &d)
    {
        cout << "operator = construct!" << endl;
        return *this;
    }

    // 添加移动构造函数
    demo(demo &&d):num(d.num){
        d.num = NULL;
        
        cout<<"move construct!"<<endl;
    }
    // ~demo()
    // {
    //     cout << "class destruct!" << endl;
    // }

private:
    int *num;
};

demo get_demo()
{
    return demo();
}

int main()
{
    demo a = get_demo();    // 对象初始化: 调用拷贝构造函数
    demo b(std::move(a));   // 优先调用移动构造函数
    // b = a;
    return 0;
}